"""
字符串函数及其操作
"""
import copy

#capitalize首字母大写，其余小写
old_str = 'hello WINNER'
new_str = old_str.capitalize()
print(old_str.capitalize())
print(new_str)

#casefold与lower，将字符串中所有字母改成小写
new_casefold = old_str.casefold()
new_lower = old_str.lower()
print(new_casefold,new_lower)

#upper,将字符串中所有字母改成大写
big_str = old_str.upper()
print(big_str)

#swapcase,将字符串中大小写互相转换
swapcase_str = old_str.swapcase()
print(swapcase_str)

#zfill为字符串定义长度，如不满足，缺少部分用0在前面填补，如果定义长度小于字符串长度，则不变化
new_zfill = old_str.zfill(20)
print(new_zfill)

#startswith与endswith 判断字符串开始或结尾是否为某个元素,返回布尔类型
print(old_str.startswith("hello"))
print(old_str.endswith("WINNER"))

#find与index 返回你想查询的元素，返回一个整型（从左到右，从0开始）,find找不到返回-1,index找不到报错
find_result = old_str.find("WINNER")
index_result = old_str.index("WINNER")

#strip去掉字符串左右两边指定的元素，默认是空格，lstrip去掉开头元素,rstrip去掉结尾元素
old_str = "   hello WINNER   "
print(old_str.strip())
print(old_str.strip('h'))

#replace将旧元素替换成新元素，并能指定替换的数量
#newstr = string.replace(old,new,max) max可选代表替换几个，默认替换全部匹配的old元素
new_replace_str = old_str.replace('WINNER','').replace('hello',"HELLO")
print(new_replace_str)

#isspace判断字符串是否为空格、istitle是否是标题每个单纯首字母大写、isupper是否都是大写、islower是否都是小写
print('     '.isspace())
print('Hello winner'.istitle()) #False

#TODO join与split

#字符串格式化 %s字符串 %d整型 %f浮点型 %u正整型 %c长度为1的字符串
info = "my name is %s ,my age is %s"
my_name = 'winner'
my_age = 18
print(info % (my_name,my_age)) #多个元素需要用元组包裹

info2 = "my name is {} ,my age is {}"
print(info2.format(my_name,my_age))

print(f"my name is {my_name} , my age is {my_age}") #要提前定义好变量名

print("{:d}".format(1))

#转义字符
#\n换行 \t横向制表符 \r回车 \'转义单引号 \"转义双引号 \\转义斜杠
info = ("my name is winner ,\n"
        "my age is 20")

#转义无效符
print(r"my name is winner \n \\")


"""
列表、元组及其操作
"""

#append添加一个元素，被添加的元素在末尾
names=["winner","winner1","winner2"]
names.append("fangmin")

#insert将一个元素添加到当前列表的指定位置中,如果位置不存在，添加到末尾（位置大于0）
names.insert(1,"fangminx")

#count查询列表或元组某个元素的个数,如果元素不存在，返回0
print(names.count("winner"))

#remove删除元素列表中的某个元素，如果不存在会报错，如果要删除的元素在列表中有多个，只会删第一个
#remove函数不会返回新的列表，而是在原来的列表中进行删除
names.remove("winner")

#内置函数del把变量完全删除
del names[0]

#reverse将类别中的元素颠倒
names.reverse()

#TODO
#sort对当前列表按照一定规律进行排序，列表中的元素类型必须相同否则报错
#list.sort(cmp=None,key=None,reverse=False)
#cmp 可选参数制定排序方案的函数
#key 参数比较
#reverse True降序 False升序（默认）
names.sort(reverse=True)
names.sort(reverse=True) #多次调用不会发生变化

#clear将当前列表的数据清空
names.clear()
print(names)

#copy将当前的列表复制一份相同的列表，新列表与旧列表内容相同，但内存空间不同
#如果列表里面还有列表，copy后内部列表发生变化，外部列表还是会互相影响(浅拷贝)

a=[1,2,3]
b=a #二次赋值的变量与原变量享有相同的内存空间
b.append(4)
print(a) # [1, 2, 3, 4]

a=[1,2,3]
b=a.copy()
b.append(4)
print(a) # [1, 2, 3]

a=[[1,2,3]]
b=a.copy()  #浅拷贝
b[0].append(4)
print(a) #[[1, 2, 3, 4]]

a=[[1,2,3]]
b=copy.deepcopy(a) #深拷贝
b[0].append(4)
print(a) #[[1, 2, 3]]

#extend将其他列表或元组中的元素倒入到当前列表中，数字和布尔is not iterable，不可导入
a = [1,2,3]
b = (4,5,6)
a.extend(b) #无返回值
a.extend("abc") #会把每个字符拆开倒入
a.extend({'name':'fangmin','age':18}) #只倒入key
print(a) #[1, 2, 3, 4, 5, 6, 'a', 'b', 'c', 'name', 'age']

#索引，字符串、列表和元组都有索引，是对某个元素进行访问
#切片是对一定范围的元素进行访问
#字符串和元组无法通过索引修改与删除
numbers = [1,2,3,4,5,6,7,8,9]
print(numbers[3:8]) #[4, 5, 6, 7, 8] 从0开始索引，左含右不含
print(numbers[:],numbers[0:]) #返回完整数据，返回的列表与原列表地址不同（但这2个地址相同）
print(numbers[:-1]) #[1, 2, 3, 4, 5, 6, 7, 8] -1代表最后一个元素，右不含
print(numbers[::-1])  #[9, 8, 7, 6, 5, 4, 3, 2, 1] 反序
print(numbers[0:6:2]) #[1, 3, 5] 2代表步长
print(numbers[0:0]) #生出空列表

numbers[2:5] = 'a','b','c' #进行赋值
print(numbers)

names = ["winner","winner1","winner2"]
print(names.index("winner1")) #返回元素所在索引位置，如果找不到可能会报错

print(names.pop(2)) #通过索引删除并获取该元素，找不到会报错
del names[0]    #直接删除，无返回值

name = "winner"
new_name = name[::-1]
print(new_name)  # 字符串的反序操作


"""
字典的常用方法
"""

#keys获取字典中所有的键
my_dict = {"name":"winner","age":18}
key_list = my_dict.keys()
print(key_list) #返回 dict_keys(['name', 'age']) 是伪列表，不具备列表所有功能
print(list(key_list)) #将伪列表转换成列表

#获取value,不存在会报错
my_name = my_dict["name"]

#修改或添加字典中的值
my_dict["name"] = "fangminx"
my_dict["gender"] = "male"
my_dict.update({"city":"上海","email":"fangminx@qq.com"})
print(my_dict)

#setdefault(key, default) 方法会在键不存在时设置默认值并返回该值
my_dict.setdefault("score",100)

#get获取当前字典中指定key的value
#dict.get(key,default=None) key:需要获取value的key defaultkey不存在返回此默认值
print(my_dict.get("score"))

#clear删除字典所有元素 dict.clear()
#pop删除字典中指定的key，并将结果返回，key不存在会报错
#del 删除整个字典对象 del dict
print(my_dict.pop("score"))
print(my_dict)

#copy返回一个内容相同，地址不同的字典
copy_dict = my_dict.copy()

#popitem 删除当前字典末尾一组键值对并将其返回
print(my_dict.popitem(),my_dict)